#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// Constantes
#define MAX_STRING 255

// Erros
#define SUCCESS 0
#define ERROR_INVALID_FILE -1
#define ERROR_INVALID_CHANNEL -2
#define ERROR_INVALID_IMAGE_DIMENSIONS -3

// Cabecalho da imagem
typedef struct imageHeader {
	short int width;
	short int height;
} ImageHeader;

// Pixel
typedef struct pixel {
	unsigned char red;
	unsigned char green;
	unsigned char blue;
	unsigned char alpha;
} Pixel;

void error_print(int code) {
	printf("\nERRO! ");
	if(code == ERROR_INVALID_FILE) printf("Arquivo invalido!\n");
	else if(code == ERROR_INVALID_CHANNEL) printf("Canal invalido!\n(Valores validos: [ r, R, g, G, b, B, a, A ])\n");
	else if(code == ERROR_INVALID_IMAGE_DIMENSIONS) printf("Dimensoes invalidas!\n(Valores validos: [ 0, 7680 ], [ 0, 4320 ])\n");
}

int main(void) {
	// VARIAVEIS

	// Iteradores
	int i, j;

	// Arquivo da imagem
	FILE *imageFile;
	char imageName[MAX_STRING], imagePath[MAX_STRING];

	// Cabecalho da imagem
	ImageHeader imageHeader;

	// Limites
	int rgbaLimit = 255;

	// Pixels
	char redPixel, greenPixel, bluePixel, alphaPixel;

	// LEITURA DOS DADOS
	printf("DADOS DA IMAGEM\n");
	printf("Largura: ");
	scanf("%hd", &imageHeader.width);
	printf("Altura: ");
	scanf("%hd", &imageHeader.height);

	// Nome do arquivo
	printf("Nome do arquivo: ");
	scanf("%s", imageName);

	// Inicializacao do caminho dos arquivos
	strcpy(imagePath, "\0");
	strcat(imagePath, "data/");
	strcat(imagePath, imageName);

	// PROCESSAMENTO DO ARQUIVO DE IMAGEM
	
	// Abre o arquivo
	imageFile = fopen(imagePath, "wb");
	if(imageFile == NULL) {
		error_print(ERROR_INVALID_FILE);
		return -1;
	}

	// Escreve o cabecalho
	fwrite(&imageHeader.width, sizeof(short int), 1, imageFile);
	fwrite(&imageHeader.height, sizeof(short int), 1, imageFile);

	// GERACAO DOS CANAIS DA IMAGEM
	for(i = 0; i < imageHeader.width; i++) {
		for(j = 0; j < imageHeader.height; j++) {
			// Vermelho
			redPixel = rand() % rgbaLimit;
			fwrite(&redPixel, sizeof(char), 1, imageFile);
			// Verde
			greenPixel = rand() % rgbaLimit;
			fwrite(&greenPixel, sizeof(char), 1, imageFile);
			// Azul
			bluePixel = rand() % rgbaLimit;
			fwrite(&bluePixel, sizeof(char), 1, imageFile);
			// Alpha
			alphaPixel = rand() % rgbaLimit;
			fwrite(&alphaPixel, sizeof(char), 1, imageFile);
		}
	}

	// ENCERRAMENTO
	fclose(imageFile);
	
	// Retorno
	return 0;
}
